package cn.picclife.mwx.manager.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FtpFileUtil {
	private static final Log log = LogFactory.getLog(FtpFileUtil.class);
	public static boolean ftpConnect(String url, int port, String userName,String password) {
		log.info("开始下载");
        boolean result = true;
        FTPClient ftp = new FTPClient();
        OutputStream os = null;
        try
        {
            log.info("开始连接");
            // 连接至服务器，端口默认为21时，可直接通过URL连接
            ftp.connect(url, port);
            ftp.setConnectTimeout(5000);//设置超时时间5秒
            log.info("连接成功");
            // 登录服务器
            ftp.login(userName, password);
            log.info("登录成功");
            log.info("返回码：" + ftp.getReplyCode());
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
            {
                log.info("不合法");
                // 不合法时断开连接
                ftp.disconnect();
                // 结束程序
                return false;
            }
            // 登出服务器
            ftp.logout();
        }
        catch (IOException e)
        {
           log.error("异常信息："+e.getMessage(),e);
        }
        finally
        {
            try
            {
                // 判断输出流是否存在
                if (null != os)
                {
                    // 关闭输出流
                    os.close();
                }
                // 判断连接是否存在
                if (ftp.isConnected())
                {
                    // 断开连接
                    ftp.disconnect();
                }
            }
            catch (IOException e)
            {
                log.error("异常信息："+e.getMessage(),e);
            }
        }
        return result;
	}
	
	/**
     * 从FTP服务器下载文件至本地
     * 
     * @param url 服务器IP地址
     * @param port 服务器端口
     * @param userName 用户登录名
     * @param password 用户登录密码
     * @param remotePath 服务器文件存储路径
     * @param fileName 服务器文件存储名称
     * @param localPath 本地文件存储路径
     * @return <b>true</b>：下载成功 <br/>
     *         <b>false</b>：下载失败
     */
    public static boolean retrieveFile(String url, int port, String userName,
        String password, String remotePath, String fileName, String localPath,String localFileName)
    {
        log.info("开始下载");
        boolean result = false;
        FTPClient ftp = new FTPClient();
        OutputStream os = null;
        try
        {
            log.info("开始连接");
            // 连接至服务器，端口默认为21时，可直接通过URL连接
            ftp.connect(url, port);
            log.info("连接成功");
            ftp.setConnectTimeout(5000);//设置超时时间5秒
            // 登录服务器
            ftp.login(userName, password);
            log.info("登录成功");
            log.info("返回码：" + ftp.getReplyCode());
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode()))
            {
                log.info("不合法");
                // 不合法时断开连接
                ftp.disconnect();
                // 结束程序
                return result;
            }
            // 设置文件操作目录
            ftp.changeWorkingDirectory(remotePath);
            log.info("切换路径成功" + remotePath);
            // 设置文件类型，二进制
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 设置缓冲区大小
            ftp.setBufferSize(3072);
            // 设置字符编码
            ftp.setControlEncoding("UTF-8");
            // 构造本地文件对象
            File localFile = new File(localPath + "/" + localFileName);
            log.info("本地路径：" + localPath + "/" + localFileName);
            // 获取文件操作目录下所有文件名称
            try
            {
                ftp.enterLocalPassiveMode();
                String[] remoteNames = ftp.listNames();
                // FTPFile[] listFiles = ftp.listFiles();
                // log.info(listFiles[0] + "," + listFiles[1]);
                // 循环比对文件名称，判断是否含有当前要下载的文件名
                
                for (String remoteName : remoteNames)
                {
                    log.info("读取本地路径文件" + remoteName);
                    if (fileName.equals(remoteName))
                    {
                        log.info("找到文件");
                        result = true;
                    }
                }
            }
            catch (Exception e)
            {
                log.info(e);
            }
            // 文件名称比对成功时，进入下载流程
            if (result)
            {
                log.info("开始下载");
                // 构造文件输出流
                os = new FileOutputStream(localFile);
                // 下载文件
                result = ftp.retrieveFile(fileName, os);
                log.info("下载结束");
                // 关闭输出流
                os.close();
            }
            // 登出服务器
            ftp.logout();
        }
        catch (IOException e)
        {
            log.error("异常信息："+e.getMessage(),e);
        }
        finally
        {
            try
            {
                // 判断输出流是否存在
                if (null != os)
                {
                    // 关闭输出流
                    os.close();
                }
                // 判断连接是否存在
                if (ftp.isConnected())
                {
                    // 断开连接
                    ftp.disconnect();
                }
            }
            catch (IOException e)
            {
                log.error("异常信息："+e.getMessage(),e);
            }
        }
        return result;
    }
}
